/**
 * DataTypeConverter.java
 * 2012-3-26 下午08:27:48
 */
package xgenerator.converter;

import xgenerator.constants.OracleDataTypes;
import xgenerator.constants.SqlDataTypes;

/**
 * <p>
 * Title:将Oracle数据类型转换为标准SQL数据类型
 * </p>
 * <p>
 * Copyright:Copyright (c) 2012
 * </p>
 * @author <a href="mailto:lishushan@gmail.com">liss</a>
 * @version 1.0
 */
public class OracleDataTypeConverter implements DataTypeConverter {

	/**
	 * 将Oracle数据类型转换为标准SQL数据类型
	 * @param dataType
	 * @param dataLength
	 * @param precision
	 * @param dataScale
	 * @return
	 * @see xgenerator.converter.DataTypeConverter#convert(java.lang.String, int, int, int)
	 */
	public String convert(String dataType, int dataLength, int precision, int dataScale) {
		String sqlType = null;
		
		if(OracleDataTypes.VARCHAR2_TYPE.equalsIgnoreCase(dataType) || OracleDataTypes.VARCHAR_TYPE.equalsIgnoreCase(dataType)) {
			sqlType = SqlDataTypes.VARCHAR_TYPE;
		} else if(OracleDataTypes.CHAR_TYPE.equalsIgnoreCase(dataType)) {
			sqlType = SqlDataTypes.CHAR_TYPE;
		} else if(OracleDataTypes.CLOB_TYPE.equalsIgnoreCase(dataType)) {
			sqlType = SqlDataTypes.CLOB_TYPE;
		} else if(OracleDataTypes.NCLOB_TYPE.equalsIgnoreCase(dataType)) {
			sqlType = SqlDataTypes.CLOB_TYPE;
		} else if(OracleDataTypes.BLOB_TYPE.equalsIgnoreCase(dataType)) {
			sqlType = SqlDataTypes.BLOB_TYPE;
		} else if(OracleDataTypes.DATE_TYPE.equalsIgnoreCase(dataType)) {
			sqlType = SqlDataTypes.DATE_TYPE;
		} else if(dataType.startsWith(OracleDataTypes.TIMESTAMP_TYPE)) {
			sqlType = SqlDataTypes.TIMESTAMP_TYPE;
		} else if(OracleDataTypes.LONG_TYPE.equalsIgnoreCase(dataType)) {
			sqlType = SqlDataTypes.BIGINT_TYPE;
		} else if(OracleDataTypes.FLOAT_TYPE.equalsIgnoreCase(dataType)) {
			sqlType = SqlDataTypes.FLOAT_TYPE;
		} else if(OracleDataTypes.BINARY_FLOAT.equalsIgnoreCase(dataType) || OracleDataTypes.BINARY_DOUBLE.equalsIgnoreCase(dataType)) {
			sqlType = SqlDataTypes.VARBINARY_TYPE;
		} else if(OracleDataTypes.NUMBER_TYPE.equalsIgnoreCase(dataType)) {
			/**
			 * oracle:
			 * 1<=precision<=38
			 * -84<=scale<=127
			 */
			if(0 == precision && 0 == dataScale) {//Number格式，声明一个浮点数
				sqlType = SqlDataTypes.NUMERIC_TYPE;
			} else if(precision > 0 && 0 == dataScale) {//Number(p)格式，声明一个整数
				if(precision == 1) {
					sqlType = SqlDataTypes.BIT_TYPE;
				} else if(precision == 2) {
					sqlType = SqlDataTypes.TINYINT_TYPE;
				} else if(precision >= 3 && precision <= 4) {
					sqlType = SqlDataTypes.SMALLINT_TYPE;
				} else if(precision >= 5 && precision <= 9) {
					sqlType = SqlDataTypes.INTEGER_TYPE;
				} else if(precision >= 10 && precision <= 18) {
					sqlType = SqlDataTypes.BIGINT_TYPE;
				} else if(precision >= 19 && precision <= 38) {
					sqlType = SqlDataTypes.NUMERIC_TYPE;
				}
			} else if(precision > 0 && dataScale > 0) {//Number(p, s)格式，声明一个定点数
				if(precision - dataScale < 0) {
					sqlType = SqlDataTypes.FLOAT_TYPE;
				} else if(precision - dataScale >= 0 && precision - dataScale < 32) {
					sqlType = SqlDataTypes.FLOAT_TYPE;
				} else if(precision - dataScale >= 32 && precision - dataScale < 64) {
					sqlType = SqlDataTypes.DOUBLE_TYPE;
				} else {
					sqlType = SqlDataTypes.NUMERIC_TYPE;
				}
			} else if(precision > 0 && dataScale < 0) {//Number(p, s)格式，声明一个定点数
				if(precision + dataScale < 0) {
					sqlType = SqlDataTypes.FLOAT_TYPE;
				} else if(precision + dataScale >= 0 && precision + dataScale < 32) {
					sqlType = SqlDataTypes.FLOAT_TYPE;
				} else if(precision + dataScale >= 32 && precision + dataScale < 64) {
					sqlType = SqlDataTypes.DOUBLE_TYPE;
				} else {
					sqlType = SqlDataTypes.NUMERIC_TYPE;
				}
			}
		}
		
		return sqlType;
	}
	
}
